package godzilla.ciudad.administradores;

import org.json.JSONObject;
import org.json.JSONString;

import godzilla.ciudad.Mapa;
import godzilla.ciudad.Punto;
import godzilla.ciudad.desastres.Godzilla;
import godzilla.ciudad.estructuras.Estructura;
import godzilla.ciudad.estructuras.NoSePuedeConstruirAquiException;
import godzilla.ciudad.estructuras.Superficie;

public class Juego implements JSONString {

	private Jugador jugador;
	private Mapa mapa;
	private int turno;

	
	private Juego(){
		//constructor para JSON
	}
	
	public Juego(int dimensionX,int dimensionY){
		this.mapa = new Mapa(dimensionX,dimensionY);
		this.turno = 1;

	}

	public void asignarJugador(Jugador jugador) {

		this.jugador = jugador;
		this.jugador.asignarJuego(this);
		
	}

	public void avanzarTurno() {

		Administrador admin = new Administrador();
		this.turno++;
		
		admin.barrerEscombrosEn(mapa);
		if (hayCuartelDeBomberos()) admin.repararEdificiosEn(mapa);
		
		admin.manejarRecursosEn(mapa);
		if (this.turno>30) jugador.depositarDinero(admin.recolectarImpuestos(mapa));
		
		
	}

	private boolean hayCuartelDeBomberos() {
		for(int x=1;x<mapa.dimensionX();x++){
			for(int y=1;y<mapa.dimensionY();y++){
				if (mapa.verEstructuraEn(new Punto(x,y)).puedeRepararEstructuras()) return true; 
			}
		}
		return false;
	}

	public void construir(Estructura estructura, Punto punto) throws NoSePuedeConstruirAquiException {

		if (this.jugador.dinero() >= estructura.costo()){
			this.mapa.construir(estructura,punto);
			this.jugador.restarDinero( estructura.costo() );
		}
		
	}

	public int turnosTranscurridos() {

		return this.turno;
	}

	public void inundar(Punto punto) {

		mapa.verSuperficieEn(punto).inundar();
		
	}

	public int dimensionMapaX() {
		return mapa.dimensionX();
	}

	public int dimensionMapaY() {
		return mapa.dimensionY();
	}

	public Estructura verEstructuraEn(Punto punto) {

		return mapa.verEstructuraEn(punto);
	}

	public Estructura verEstructuraSubterraneaEn(Punto punto) {

		return mapa.verEstructuraSubterraneaEn(punto);
	}

	public Superficie verSuperficieEn(Punto punto) {
		return mapa.verSuperficieEn(punto);
	}

	public Superficie verSuperficieSubterraneaEn(Punto punto) {
		return mapa.verSuperficieSubterraneaEn(punto);
	}

	public void destruirEstructuraEn(Punto punto) {
		
		mapa.destruirEstructuraEn(punto);
		
	}

	public void esAtacadoPorGodzilla(Godzilla godzilla) {

		godzilla.atacarMapa(mapa);
		
	}

	public static Juego obtenerObjetoDesdeJSON(String cadenaJSON) {
		JSONObject objetoJSON = new JSONObject(cadenaJSON);
		Juego juego = new Juego();
		juego.mapa = Mapa.obtenerObjetoDesdeJSON(objetoJSON.getJSONObject("Mapa").toString());
		return juego;
		
	}

	@Override
	public String toJSONString() {
		JSONObject objetoJSON = new JSONObject();
		JSONObject objetoJSONMapa = new JSONObject(this.mapa.toJSONString());
		objetoJSON.put("Turno", this.turno);
		objetoJSON.put("Mapa", objetoJSONMapa);
		return (objetoJSON.toString());
		
	}

}
